#include<bits/stdc++.h>
#define int long long
#define pii pair <int,int>
using namespace std;
const int N=3009;
int T;
bool ck[60009];
bool prime(int x){
	if(x<=1) return 0;
	for(int i=2;i*i<=x;i++)
		if(x%i==0) return 0;
	return 1;
}
void init(){
	for(int i=1;i<=60000;i++)
		if((i%20==3||i<=10)&&prime(i)) ck[i]=1;
}
int n,m,x[N],y[N],o[N],a[5],ans;
int dis(int i,int j){
	return abs(x[i]-x[j])+abs(y[i]-y[j]);
}
pii d[N][N];
int dy[N][N],len,cnt[N];
bool vis[200009];
bitset <3005> b[200009][2];
struct node{
	int p,q;
	bool operator<(const node &x)const{
		return dis(p,q)<dis(x.p,x.q);
	}
}rq[N][N];
void solve(){
	ans=0;len=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
	for(int i=1;i<=n;i++) cin>>o[i];
	if(n<=100){
		for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			for(int k=j+1;k<=n;k++){
				a[1]=dis(i,j);a[2]=dis(j,k);a[3]=dis(i,k);
				sort(a+1,a+4);
				if(ck[a[2]]) ans+=o[i]+o[j]+o[k];
			}
		cout<<ans<<'\n';
		return;
	}
	ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++) d[i][j]={dis(i,j),j};
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j&&ck[d[i][j].first]){
				if(i>j){
					len++;
					dy[i][j]=dy[j][i]=len;
				}
				rq[i][++cnt[i]]={i,j};
			}
	for(int i=1;i<=n;i++) sort(d[i]+1,d[i]+n+1);
	for(int i=1;i<=n;i++) sort(rq[i]+1,rq[i]+cnt[i]+1);
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=cnt[i];j++) cout<<rq[i][j].q<<' ';
//		cout<<endl;
//	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=cnt[i];j++)
			for(int k=1;k<=cnt[i];k++)
				if(j!=k&&dis(i,rq[i][j].q)==dis(i,rq[i][k].q)) ans--;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=cnt[i];j++)
			for(int k=1;k<=cnt[i];k++)
				if(j!=k&&dis(i,rq[i][j].q)==dis(i,rq[i][k].q)&&dis(i,rq[i][j].q)==dis(rq[i][j].q,rq[i][k].q)) ans++;
	}
	for(int i=1;i<=n;i++){
		int j=0;
		bitset <3005> z;
		z.reset();
		for(int k=1;k<=cnt[i];k++){//cout<<i<<' '<<rq[i][k].q<<' '<<dis(i,rq[i][k].q)<<endl;
			while(j<n&&d[i][j+1].first<=dis(i,rq[i][k].q)){
				j++;
				if(d[i][j].second!=i) z.set(d[i][j].second,1);
			}//for(int q=1;q<=3;q++) cout<<z[q];cout<<endl;
			int num=dy[i][rq[i][k].q];
			if(i<rq[i][k].q) b[num][0]=z;
			else b[num][1]=z;
		}
	}
	for(int i=1;i<=n;i++){
		int j=n+1;
		bitset <3005> z;
		z.reset();
		for(int k=cnt[i];k>=1;k--){//cout<<i<<' '<<rq[i][k].q<<' '<<dis(i,rq[i][k].q)<<endl;
			while(j>1&&d[i][j-1].first>=dis(i,rq[i][k].q)){
				j--;
				if(d[i][j].second!=i) z.set(d[i][j].second,1);
			}//for(int q=1;q<=3;q++) cout<<z[q];cout<<endl;
			int num=dy[i][rq[i][k].q];
			if(i<rq[i][k].q) ans+=(b[num][1]&z).count();
			else ans+=(b[num][0]&z).count();
		}
	}
	cout<<ans*3<<'\n';
}
signed main(){
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout);
	init();
	cin>>T;
	while(T--) solve();
	return 0;
}
/*
1
3 5
1 1
3 4
2 2
1 1 1
*/
